<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // js数据类型的检测方式

    // 1、typeof   检测数据类型的运算符
    // console.log("数值",typeof 10);
    // console.log("布尔",typeof true);
    // console.log("字符串",typeof '你好');
    // console.log("数组",typeof []);
    // console.log("函数",typeof function(){});
    // console.log("对象",typeof {});
    // console.log("undefined",typeof undefined);
    // console.log("null",typeof null);//空对象指针 基本数据类型
    // var reg =/upupup/;
    // console.log(typeof reg);

    // 2、instanceof  检测某一个实例是否属于这个类  可以正确判断对象的类型
    // 内部运行机制：判断在他的原型链上能否这个类型的原型 检测Object是否为constructor 的实例对象

    // console.log("数值",10 instanceof Number);
    // console.log("布尔",true instanceof Boolean);
    // console.log("字符串", '你好' instanceof String);
    // console.log("数组", [] instanceof Array);
    // console.log("函数", function(){} instanceof Function);
    // console.log("对象",{} instanceof Object);
    // var reg =/upupup/;
    // console.log(reg  instanceof);

    //3、 constructor 检测实例和类的关系 根据实例和类的关系 检测数据类型
    console.log("数值",(10).constructor === Number);
    console.log("布尔",(true).constructor ===  Boolean);
    console.log("字符串", ('你好').constructor === String);
    console.log("数组", ([]).constructor === Array);
    console.log("函数", (function(){}).constructor === Function);
    console.log("对象",({}).constructor === Object);
    // new Data().constructor === Date; constructor属性返回的是对象的构造函数

    //4、 Object.prototype.toString.call()
    var a  = Object.prototype.toString;


    console.log("数值",a.call(10));
    console.log("布尔",a.call(true));
    console.log("字符串",a.call('你好'));
    console.log("数组",a.call([]));
    console.log("函数",a.call(function(){}));
    console.log("对象",a.call({}));
    console.log("undefined",a.call(undefined));
    console.log("null",a.call(null));
    // "[object 所属类]"


    // 总结：typeof 一般用来检测简单数据类型是比较准确的
    //      instanceof 用来检测对象即复杂数据类型 不能检测简单数据类型
    //      constructor和instanceof不能检测null和undefined这两个特殊值
    //      Object.prototype.toString.call() 可以判断所有数据类型  但低版本IE不兼容
</script>
</html>